package utils

import (
	"fmt"
	"os"
	"path/filepath"
	"regexp"
	"strings"
	"xian-codegen/lib/context"
)

// 获取所有SQL文件
func findSqlFiles(dir string, sqlFiles *[]string, csvFiles *[]string) error {
	wd, _ := os.Getwd()
	dir = fmt.Sprintf("%s/tables/%s", wd, dir)
	// 使用 filepath.Walk 函数遍历目录树
	return filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
		if err != nil {
			return err // 如果出现错误，直接返回
		}

		// 检查是否为目录
		if info.IsDir() {
			findSqlFiles(fmt.Sprintf("%s/%s", dir, path), sqlFiles, csvFiles)
		}

		// 获取文件扩展名
		ext := strings.ToLower(filepath.Ext(path))

		// 根据扩展名添加到相应的切片
		switch ext {
		case ".sql":
			*sqlFiles = append(*sqlFiles, path)
		case ".sql.csv":
			*csvFiles = append(*csvFiles, path)
		}
		return nil
	})

}

// 执行SQL文件
func execSqlFile(ctx *context.Context, sqlFilePath string) error {
	// 读取文件内容
	sqlContent, _ := os.ReadFile(sqlFilePath)
	// ";"切割每个SQL
	regex := regexp.MustCompile(`;[\s\S]?\n`)

	sqlArray := regex.Split(string(sqlContent), -1)
	for i := range sqlArray {
		sql := sqlArray[i]
		regexReplace := regexp.MustCompile(`--[\s\S]*?\n`)
		sql = regexReplace.ReplaceAllString(strings.Trim(sql, ""), "")
		if len(sql) > 0 {
			_, err := ctx.Connection.Exec(sql)
			if err != nil {
				return err
			}
		}
	}
	return nil
}

// 初始化数据库
func InitDB() {
	ctx := context.UseContext()
	sqlFilePaths := make([]string, 0)
	csvFilePaths := make([]string, 0)

	findSqlFiles("", &sqlFilePaths, &csvFilePaths)
	for i := 0; i < len(sqlFilePaths); i++ {
		sqlFile := sqlFilePaths[i]
		err := execSqlFile(ctx, sqlFile)
		if err != nil {
			panic(err)
		}

	}

}
